package com;

import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;

/**
 * 想要让TreeSet 集合中的元素进行有序排序,有三种方式,
 * 
 * 1.要添加的元素对应的类实现 java.Comparable 接口,并实现 compareTo 方法
 * 
 * 2.让 SortedSet 集合做到排序还有一种方法, java.util.Comparator 比较器类
 * 
 * 3.写一个匿名内部类,还是 java.util.Comparator
 * 
 * 默认的一些类型中,都实现了比较器,比如 Date,String,Integer 等等
 * 
 * 所以,我们自定义的类一个数据结构的时候(类),当需要这个类对象进行排序,就需要我们自定义比较器,用于比较
 * 
 * 如果两种排序方式都有的话,优先使用 compare() 方法 源码中是这样调用的,先判断有没有 compare(),如果没有再去执行
 * compareTo(), 在TreeMap类中的1294行
 * 
 * Comparable : 我们叫做元素自身的比较器,就是要添加的元素需要实现这个接口,这种情况下一般用于我们自定义的类中
 * 
 * Comparator : 比较器类,常应用于 : 比如Integer是默认升序,我想降序,就需要使用 Comparator 来重新设置排序,因为它的优先级高
 * 
 * 		如果添加元素,不是我们自定的类,
 * 			1.该类有排序(实现了Comparable) , 但不是我们想要的排序效果,需要使用 Comparator 来进行调整排序,因为它的优先级高
 * 			2.如果该类没有排序(没有实现 Comparable), 我们就需要使用 Comparator 来设置排序,因为这个时候我们不可以去更改人家的源码,不可能让这个类去实现 Comparable 的
 * @author lenovo
 * @Date 2020年7月18日
 * @Time 上午8:38:34
 */
public class Collection_11_SortedSet_03 {

	public static void main(String[] args) {
//		SortedSet products = new TreeSet(new ProductComparator());
		@SuppressWarnings("unchecked")
		SortedSet products = new TreeSet(new Comparator() {
		
			//匿名内部类实现
			@Override
			public int compare(Object o1, Object o2) {
				// o1是要添加的元素
				// o2是集合中的元素
				double price1 = ((Product1)o1).price;
				double price2 = ((Product1)o2).price;
				if (price1 == price2) {
					return 0;
				}else if (price1 > price2) {
					return 1;
				}else {
					return -1;
				}
			}
			

		});
		Product1 p1 = new Product1(1.5);
		Product1 p2 = new Product1(2.2);
		Product1 p3 = new Product1(0.5);
		products.add(p1);
		products.add(p2);
		products.add(p3);
		System.out.println(products);
		//[Product1 [price=0.5], Product1 [price=1.5], Product1 [price=2.2]]

	}

}
class Product1{
	double price;
	public Product1(double price) {
		super();
		this.price=price;
	}
	@Override
		public String toString() {
			return "Product1 [price="+price+"]";
		}
}

class ProductComparator implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		// o1是要添加的元素
		// o2是集合中的元素
		double price1 = ((Product1)o1).price;
		double price2 = ((Product1)o2).price;
		if (price1 == price2) {
			return 0;
		}else if (price1 > price2) {
			return 1;
		}else {
			return -1;
		}
	}
	
}